package com.senlingspace.common.request;

import com.senlingspace.common.annotation.ValidAuthCode;
import lombok.Data;

import javax.validation.Valid;
import javax.validation.constraints.*;
import java.io.Serializable;
import java.util.List;

/**
 * 扫码支付请求
 *
 * @author lebronjames
 * @date 2024/07/26
 */
@Data
@ValidAuthCode
public class PaymentRequest implements Serializable {

    /**
     * 用户在门店购买支付方式
     */
    public static final String CASH_PAY = "CASH_PAY";
    public static final String ONLINE_PAY = "ONLINE_PAY";

    /**
     * 前台下单商品类型
     */
    public static final String TICKET = "TICKET";
    public static final String GOODS = "GOODS";


    /**
     * 用户购买方式
     * <p>
     * CASH_PAY、ONLINE_PAY
     */
    @NotBlank(message = "用户购买方式不能为空！")
    @Pattern(regexp = "CASH_PAY|ONLINE_PAY", message = "用户购买方式只能是CASH_PAY或ONLINE_PAY！")
    private String paymentMethod;

    /**
     * 授权码
     * <p>
     * 前端必须做 base64 编码
     */
    private String authCode;

    /**
     * 门店 ID
     */
    @NotNull(message = "门店ID不能为空！")
    private Long shopId;

    /**
     * 项目 ID
     */
    @NotNull(message = "项目ID不能为空！")
    private Long projectId;

    /**
     * 购买清单
     */
    @Valid
    @NotNull(message = "购买清单不能为空！")
    @Size(min = 1, message = "购买清单中至少需要包含一条记录！")
    private List<PayInventory> payInventories;

    @Data
    public static class PayInventory implements Serializable {
        /**
         * 项目 ID
         * <p>
         * 如果 type 是 TICKET, 对应的是票价方案明细 ID
         * 如果 type 是 GOODS, 对应的是商品表 ID
         */
        @NotNull(message = "项目ID不能为空！")
        private Long itemId;

        /**
         * 购买数量
         */
        @NotNull(message = "购买数量不能为空！")
        @Min(value = 1, message = "购买数量必须大于0！")
        private Integer quantity;

        /**
         * 商品类型
         * <p>
         * TICKET、GOODS
         */
        @NotBlank(message = "商品类型不能为空！")
        @Pattern(regexp = "TICKET|GOODS", message = "商品类型只能是TICKET或GOODS！")
        private String type;
    }

}
